#!/usr/bin/env python

import getopt,sys
import subprocess
from random import random,randint,seed
from math import sqrt
seed(1234) # defino el seed para hacer el experimento reproducible

ejecutable="cw_n3"
tamanios_entrada=sorted(range(1,45)*2)
def prueba(tamanio_entrada):
	out=str(tamanio_entrada)
	for i in range(tamanio_entrada):
		out+='\n'
		li=list(set([str(x+1) for x in [randint(0,tamanio_entrada-1) for am in range(randint(0,tamanio_entrada))] if x!=i]))
		out+=str(len(li))+' '+' '.join(li)
	return out
ender="-1"


pruebas=[(n,prueba(n)) for n in tamanios_entrada]
open('test.in','w').write('\n'.join(map(lambda x:x[1],pruebas)))

def runtest(pruebas,args):
	fp=subprocess.Popen(['./'+ejecutable]+args, shell=False, stdin=subprocess.PIPE,stdout=subprocess.PIPE)
	for prueba in pruebas:
		fp.stdin.write(prueba[1]+"\n") # le manda la instancia
		r=fp.stdout.readline().rstrip() # recibo el resultado
		print "tamanio: ",prueba[0]," ",args[0],"=",r
		yield prueba[0],r # lo devuelvo
	fp.stdin.write(ender+"\n")

def usage():
	print "Usage:"
	print "-t (o --time) para calcular tiempos"
	print "-c (o --count) para contar operaciones"
	sys.exit(2)

try:
	opts, args = getopt.getopt(sys.argv[1:], "tc", ["time", "count"])
except getopt.GetoptError, err:
	# print help information and exit:
	print str(err) # will print something like "option -a not recognized"
	usage()
if not opts: usage()

opts=map(lambda x: x[0],opts)

out=""
if "--time" in opts or "-t" in opts:
	for i in runtest(pruebas,['time','0.06','3']): # para cada caso de prueba...
		vals=map(float,i[1].split()) # obtengo la lista de los tiempos
		val=reduce(lambda x,y:x+y,vals)/len(vals) # tomo el primedio
		err=max([abs(x-val) for x in vals]) # calculo el error
		dat = (str(i[0])+"\t"+ "%.8f"%val +"\t"+ "%.8f"%err +"\n") # lo preparo para el archivo de salida
		out += dat
	open('time_err_n3.dat','w').write(out) # lo guardo en el archivo
	print "\nOutput escrito a time_err_n3.dat"

out=""
if "--count" in opts or "-c" in opts:
	for i in runtest(pruebas,['count']): #para cada caso de prueba..
		dat = str(i[0])+"\t"+i[1]+"\n" # lo formateo para la salida
		out += dat
	open('counts_n3.dat','w').write(out) # lo guardo en el archivo
	print "\nOutput escrito a counts_n3.dat"
